import 'package:dio/dio.dart';
import '../services/toast_service.dart';

/// 简单的错误拦截器 - 统一处理异常并使用ToastService显示提示
class SimpleErrorInterceptor extends Interceptor {
  
  SimpleErrorInterceptor();

  @override
  void onError(DioException err, ErrorInterceptorHandler handler) {
    print('🔥 拦截到网络错误: ${err.type}');
    print('🔥 错误URL: ${err.requestOptions.uri}');
    print('🔥 状态码: ${err.response?.statusCode}');
    
    // 获取错误信息
    String errorMessage = _getErrorMessage(err);
    print('🔥 错误信息: $errorMessage');
    
    // 使用ToastService显示错误提示
    _showErrorToast(errorMessage, err);
    
    // 继续传递错误
    super.onError(err, handler);
  }

  /// 获取用户友好的错误信息
  String _getErrorMessage(DioException error) {
    // 1. 尝试从服务器响应获取错误信息
    if (error.response?.data != null) {
      try {
        final data = error.response!.data;
        if (data is Map<String, dynamic>) {
          final message = data['message'] ?? data['msg'] ?? data['error'];
          if (message != null) return message.toString();
        }
        if (data is String) return data;
      } catch (e) {
        print('解析服务器错误信息失败: $e');
      }
    }

    // 2. 根据HTTP状态码返回错误信息
    if (error.response?.statusCode != null) {
      switch (error.response!.statusCode!) {
        case 400: return '请求参数错误';
        case 401: return '未授权，请重新登录';
        case 403: return '权限不足';
        case 404: return '请求的资源不存在';
        case 500: return '服务器内部错误';
        case 502: return '网关错误';
        case 503: return '服务暂时不可用';
        default: return '服务器错误 (${error.response!.statusCode})';
      }
    }

    // 3. 根据异常类型返回错误信息
    switch (error.type) {
      case DioExceptionType.connectionTimeout:
        return '连接超时，请检查网络';
      case DioExceptionType.sendTimeout:
        return '发送超时，请重试';
      case DioExceptionType.receiveTimeout:
        return '接收超时，请重试';
      case DioExceptionType.connectionError:
        return '网络连接失败';
      case DioExceptionType.cancel:
        return '请求已取消';
      default:
        return '网络请求失败：${error.message ?? "未知错误"}';
    }
  }

  /// 使用ToastService显示错误提示
  void _showErrorToast(String message, DioException err) {
    print('🍞 显示Toast错误提示: $message');
    
    // 根据错误类型确定标题
    String title = '网络错误';
    if (err.response?.statusCode != null) {
      title = '服务器错误 ${err.response!.statusCode}';
    } else if (err.type == DioExceptionType.connectionTimeout ||
               err.type == DioExceptionType.receiveTimeout ||
               err.type == DioExceptionType.sendTimeout) {
      title = '连接超时';
    } else if (err.type == DioExceptionType.connectionError) {
      title = '连接失败';
    }
    
    // 使用ToastService显示错误
    ToastService.showError(message, title: title);
  }
}
